import axios from 'axios'
import { ElMessage } from 'element-plus'
import { emitter } from './emitter'

// 创建axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:6002',
  timeout: 15000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么

    // 添加token到请求头
    const token = localStorage.getItem('token')
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }

    // 添加时间戳防止缓存
    if (config.method === 'get') {
      config.params = {
        ...config.params,
        _t: Date.now()
      }
    }

    console.log('请求配置:', config)
    return config
  },
  error => {
    // 对请求错误做些什么
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 对响应数据做点什么
    const { data, status } = response

    console.log('响应数据:', data)

    let imgurl = data.newImgPath;
    let chinesename = data.chineseName;
    let englishname = data.englishName;
    let confidence = Math.round(data.confidenceDegree * 100)+"%";
    console.log("imgurl:", imgurl);
    
    // 如果有imgurl，则通过emitter发送给shiyu.vue组件
    if (imgurl) {
      emitter.emit('update-fish-image', imgurl);
      emitter.emit('update-fish-chinese-name', chinesename);
      emitter.emit('update-fish-english-name', englishname);
      emitter.emit('update-fish-confidence', confidence);
    } 
    // 如果是图片识别相关的响应但没有imgurl，则提示识别失败
    else if (response.config.url && response.config.url.includes('/gateway/fish/upload')) {
      ElMessage.error('识别失败');
    }

    // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
    if (status === 200) {
      // 根据后端接口文档，成功时code为0或200
      if (data.code === 0 || data.code === 200) {
        return data
      } 
    } else {
      ElMessage.error('网络错误')
      return Promise.reject(new Error('网络错误'))
    }
  },
  error => {
    // 对响应错误做点什么
    console.error('响应错误:', error)

    if (error.response) {
      const { status, data } = error.response

      switch (status) {
        case 401:
          ElMessage.error('未授权，请重新登录')
          // 清除token并跳转到登录页
          localStorage.removeItem('token')
          // 这里可以添加路由跳转到登录页的逻辑
          break
        case 403:
          ElMessage.error('拒绝访问')
          break
        case 404:
          ElMessage.error('请求错误，未找到该资源')
          break
        case 405:
          ElMessage.error('请求方法未允许')
          break
        case 408:
          ElMessage.error('请求超时')
          break
        case 500:
          ElMessage.error('服务器端出错')
          break
        case 501:
          ElMessage.error('网络未实现')
          break
        case 502:
          ElMessage.error('网络错误')
          break
        case 503:
          ElMessage.error('服务不可用')
          break
        case 504:
          ElMessage.error('网络超时')
          break
        case 505:
          ElMessage.error('http版本不支持该请求')
          break
        default:
          ElMessage.error(data?.msg || '连接错误')
      }
    } else if (error.code === 'ECONNABORTED') {
      ElMessage.error('请求超时')
    } else {
      ElMessage.error('网络连接异常')
    }

    return Promise.reject(error)
  }
)

// 封装GET请求
export function get(url, params, config = {}) {
  return service.get(url, { params, ...config })
}

// 封装POST请求
export function post(url, data, config = {}) {
  return service.post(url, data, config)
}

// 封装PUT请求
export function put(url, data, config = {}) {
  return service.put(url, data, config)
}

// 封装DELETE请求
export function del(url, config = {}) {
  return service.delete(url, config)
}

// 封装PATCH请求
export function patch(url, data, config = {}) {
  return service.patch(url, data, config)
}

// 导出axios实例
export default service